package hashmap;
/**
 * @Time2019/12/9
 * @author 王光浩
 * @Method 需求：设计一个hashmap，用于存储0-1000000之间的的键值和键值对应的value，不可使用系统自带的hashmap库。
 *         思路：理解hashset和hashmap的区别，hashset相当于把hashmap中的value抽去，它只关注键值是否存在，判断是否会有重复的放入键
 *               值，而hashmap在hashset上有所有加强，使用hashmap可以存放一个键值对，在实现时我们通过key来保存对应的value，我们也可以
 *               根据key在hashmap中取出对应的值。
 *               所以根据前面的hashset我们可以同样设置一个hashmap（关于hashmap的关键仍然是key），同样的流程，只是在存储时 不在是true或者
 *               false。而是key对应的value值。hash函数为y=x%1000001
 *         步骤：
 *           （1）初始化：将对应的长度为1000001的数组进行分配空间同时将初值设为-1
 *           （2）加入元素put(),首先根据hash函数查看对应的位置是否为-1，如果是的话则更改数组中对应元素的值，否则进行更新
 *           （3）获取元素，根据hash函数在数组中找出对应的位置，如果值为-1，则代表该处未存值，则返回-1
 *           （4）移除元素。根据hash函数，判断对应的key是否存储过，如果存储过则将对应的值变为-1。
 *   优点：存储、删除和获取元素的复杂度为1，但是hash函数的构建使用了长度为1000001的存储空间，内存的浪费比较大，会造成大量的浪费
 *           
 *
 */
public class MyHashMap {
	
	//用于保存key和value
	int[] map;
    /** 进行初始化，为数组分配空间，并将数组的所有元素变成-1*/
    public MyHashMap() {
        map=new int[1000001];
        for(int i=0;i<1000001;i++)
        	map[i]=-1;
    }
    
    /** 添加元素. */
    public void put(int key, int value) {
        map[key]=value;           //使用hash映射找到key的位置然后存储value的值
    }
    
    /** 获取与key对应的元素 */
    public int get(int key) {
        return map[key];
    }
    
    /** 移除key与对应的value */
    public void remove(int key) {
        map[key]=-1;
    }
}
